package org.example.shop_front_api.utils;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * Instant时间戳转换工具类
 * 提供Instant与毫秒数、Date、LocalDateTime及字符串的相互转换
 */
public class InstantConverter {

    // 默认时区，可根据需要修改
    private static final ZoneId DEFAULT_ZONE = ZoneId.systemDefault();

    // 常用日期时间格式
    public static final String PATTERN_FULL = "yyyy-MM-dd HH:mm:ss.SSS";
    public static final String PATTERN_STANDARD = "yyyy-MM-dd HH:mm:ss";
    public static final String PATTERN_DATE = "yyyy-MM-dd";
    public static final String PATTERN_TIME = "HH:mm:ss";

    /**
     * 将毫秒数转换为Instant
     * @param milliseconds 毫秒数
     * @return Instant对象
     */
    public static Instant fromMilliseconds(long milliseconds) {
        return Instant.ofEpochMilli(milliseconds);
    }

    /**
     * 将Instant转换为毫秒数
     * @param instant Instant对象
     * @return 毫秒数
     */
    public static long toMilliseconds(Instant instant) {
        if (instant == null) {
            return 0;
        }
        return instant.toEpochMilli();
    }

    /**
     * 将Date转换为Instant
     * @param date Date对象
     * @return Instant对象
     */
    public static Instant fromDate(Date date) {
        if (date == null) {
            return null;
        }
        return date.toInstant();
    }

    /**
     * 将Instant转换为Date
     * @param instant Instant对象
     * @return Date对象
     */
    public static Date toDate(Instant instant) {
        if (instant == null) {
            return null;
        }
        return Date.from(instant);
    }

    /**
     * 将LocalDateTime转换为Instant
     * @param localDateTime LocalDateTime对象
     * @return Instant对象
     */
    public static Instant fromLocalDateTime(LocalDateTime localDateTime) {
        return fromLocalDateTime(localDateTime, DEFAULT_ZONE);
    }

    /**
     * 将LocalDateTime转换为Instant，指定时区
     * @param localDateTime LocalDateTime对象
     * @param zoneId 时区
     * @return Instant对象
     */
    public static Instant fromLocalDateTime(LocalDateTime localDateTime, ZoneId zoneId) {
        if (localDateTime == null || zoneId == null) {
            return null;
        }
        return localDateTime.atZone(zoneId).toInstant();
    }

    /**
     * 将Instant转换为LocalDateTime
     * @param instant Instant对象
     * @return LocalDateTime对象
     */
    public static LocalDateTime toLocalDateTime(Instant instant) {
        return toLocalDateTime(instant, DEFAULT_ZONE);
    }

    /**
     * 将Instant转换为LocalDateTime，指定时区
     * @param instant Instant对象
     * @param zoneId 时区
     * @return LocalDateTime对象
     */
    public static LocalDateTime toLocalDateTime(Instant instant, ZoneId zoneId) {
        if (instant == null || zoneId == null) {
            return null;
        }
        return LocalDateTime.ofInstant(instant, zoneId);
    }

    /**
     * 将字符串转换为Instant，使用默认格式
     * @param dateTimeStr 日期时间字符串
     * @return Instant对象
     */
    public static Instant fromString(String dateTimeStr) {
        return fromString(dateTimeStr, PATTERN_STANDARD);
    }

    /**
     * 将字符串转换为Instant，指定格式
     * @param dateTimeStr 日期时间字符串
     * @param pattern 日期格式
     * @return Instant对象
     */
    public static Instant fromString(String dateTimeStr, String pattern) {
        return fromString(dateTimeStr, pattern, DEFAULT_ZONE);
    }

    /**
     * 将字符串转换为Instant，指定格式和时区
     * @param dateTimeStr 日期时间字符串
     * @param pattern 日期格式
     * @param zoneId 时区
     * @return Instant对象
     */
    public static Instant fromString(String dateTimeStr, String pattern, ZoneId zoneId) {
        if (dateTimeStr == null || pattern == null || zoneId == null) {
            return null;
        }

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr, formatter);
        return localDateTime.atZone(zoneId).toInstant();
    }

    /**
     * 将Instant转换为字符串，使用默认格式
     * @param instant Instant对象
     * @return 日期时间字符串
     */
    public static String toString(Instant instant) {
        return toString(instant, PATTERN_STANDARD);
    }

    /**
     * 将Instant转换为字符串，指定格式
     * @param instant Instant对象
     * @param pattern 日期格式
     * @return 日期时间字符串
     */
    public static String toString(Instant instant, String pattern) {
        return toString(instant, pattern, DEFAULT_ZONE);
    }

    /**
     * 将Instant转换为字符串，指定格式和时区
     * @param instant Instant对象
     * @param pattern 日期格式
     * @param zoneId 时区
     * @return 日期时间字符串
     */
    public static String toString(Instant instant, String pattern, ZoneId zoneId) {
        if (instant == null || pattern == null || zoneId == null) {
            return null;
        }

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return formatter.format(toLocalDateTime(instant, zoneId));
    }
}



